﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data.SqlClient;
using System.Data;

namespace BLL
{
    public class BangDiemBUO : IBUO<tbl_BangDiem>
    {
        CSDLQLDiemHSC3DataContext context = new CSDLQLDiemHSC3DataContext();
        public bool Insert(tbl_BangDiem obj)
        {
            try
            {
                context.tbl_BangDiems.InsertOnSubmit(obj);
                context.SubmitChanges();
                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool Delete(string id)
        {
            throw new NotImplementedException();
        }

        public bool Delete(tbl_BangDiem obj)
        {
            throw new NotImplementedException();
        }

        public List<tbl_BangDiem> GetAll()
        {
            throw new NotImplementedException();
        }

        public tbl_BangDiem GetSingle(string id)
        {
            throw new NotImplementedException();
        }

        public bool Update(string id, tbl_BangDiem obj)
        {
            throw new NotImplementedException();
            
            
        }

        public bool Update(string idhs, string idky,string idgv, string idmh,tbl_BangDiem obj)
        {
            try
            {
                tbl_BangDiem bd = context.tbl_BangDiems.Where(n => n.id_HocSinh.Equals(idhs)&&n.id_Ky.Equals(idky)&&n.id_GiaoVien.Equals(idgv)&&n.id_MonHoc.Equals(idmh)).ToList<tbl_BangDiem>().FirstOrDefault();
                bd = obj;
                context.SubmitChanges();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// HIển thị danh sách năm học
        /// </summary>
        /// <returns></returns>
        public IQueryable getAllNamHoc()
        {
            var list = context.tbl_NamHocs;
            return list;
        }
        /// <summary>
        /// Hiển thị kỳ theo từng năm học
        /// </summary>
        /// <param name="idNam"></param>
        /// <returns></returns>
        public IQueryable getKyByIdNamHoc(String idNam)
        {
            var list = context.tlb_Kies.Where(n => n.id_NamHoc.Trim().Equals(idNam.Trim()));
            return list;
        }
        /// <summary>
        /// hiển thị danh sách khối
        /// </summary>
        /// <returns></returns>
        public IQueryable getAllKhoi()
        {
            return context.tbl_Khois;
        }

        public IQueryable showDSLopTungNam(String idKhoi, String idNamHoc)
        {
            var list = context.tbl_NamHocs.Join(
                    context.tbl_KhoaHocs,
                    a => a.id_KhoaHoc,
                    b => b.id_KhoaHoc,
                    (a, b) => new
                    {
                        id_NamHoc = a.id_NamHoc,
                        id_KhoaHoc = b.id_KhoaHoc
                    }
                ).Join(
                    context.tbl_Lops,
                    c => c.id_KhoaHoc,
                    d => d.id_KhoaHoc,
                    (c, d) => new
                    {
                        id_NamHoc = c.id_NamHoc,
                        id_Lop = d.id_Lop,
                        id_Khoi = d.id_Khoi,
                        TenLop = d.TenLop
                    }
                ).Where(n => n.id_NamHoc.Equals(idNamHoc) && n.id_Khoi.Equals(idKhoi));
            return list;
        }

        /// <summary>
        /// Hiển thị môn học theo từng khối
        /// </summary>
        /// <param name="idKhoi"></param>
        /// <returns></returns>
        public IQueryable HienThiMonTheoKhoi(String idKhoi)
        {
            var list = context.tbl_MonHocs.Join(
                    context.tbl_Khois,
                    a => a.id_Khoi,
                    b => b.id_Khoi,
                    (a, b) => new
                    {
                        id_MonHoc = a.id_MonHoc,
                        id_Khoi = b.id_Khoi,
                        TenMonHoc = a.TenMonHoc
                    }
                ).Where(n => n.id_Khoi.Trim().Equals(idKhoi.Trim()));
            return list;
        }
        /// <summary>
        /// Hiển thị giáo viên theo từng môn học
        /// </summary>
        /// <param name="idMonHoc"></param>
        /// <returns></returns>
        public IQueryable HienThiGVTheoIdMonHoc(String idMonHoc)
        {
            var list = context.tbl_GiaoViens.Where(n => n.id_MonHoc.Trim().Equals(idMonHoc));
            return list;
        }

        /// <summary>
        /// Liệt kê tất cả id học sinh 
        /// </summary>
        /// <returns></returns>
        public IQueryable getAllIdHocSinhByIdLop(String idLop)
        {
            var list = context.tbl_HocSinhs.Where(p=>p.id_Lop.Trim().Equals(idLop.Trim())).Select(n => n.id_HocSinh);
            return list;
        }

        public List<tbl_HocSinh> getAllHocSinhByIdLop(String idLop)
        {
            return context.tbl_HocSinhs.Where(n => n.id_Lop.Trim().Equals(idLop.Trim())).ToList<tbl_HocSinh>();
        }

        

        public tbl_HocSinh getHS(String idHS)
        {
            return context.tbl_HocSinhs.Where(p => p.id_HocSinh.Trim().Equals(idHS.Trim())).FirstOrDefault();
        }

        /// <summary>
        /// Hiển thị bảng điểm
        /// </summary>
        /// <param name="idHS"></param>
        /// <param name="idKy"></param>
        /// <param name="idGV"></param>
        /// <param name="idMon"></param>
        /// <returns></returns>
        public DataTable showBangDiemTheoLop(String idKy, String idMon,String idLop,String idGV)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy,
                        id_Lop = b.id_Lop
                    }
                ).Where(n => n.id_Ky.Trim().Equals(idKy.Trim()) && n.id_MonHoc.Trim().Equals(idMon.Trim()) && n.id_Lop.Trim().Equals(idLop) && n.id_GiaoVien.Equals(idGV));

            
            return ToDataTable(list);
        }
        /// <summary>
        /// bảng điểm từng môn của từng lớp trong 1 kỳ*******
        /// </summary>
        /// <param name="idKy"></param>
        /// <param name="idGV"></param>
        /// <param name="idMon"></param>
        /// <param name="idLop"></param>
        /// <returns></returns>
        public IQueryable showBangDiemTheoLopTheoTungMon(String idKy, String idMon, String idLop)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        NgaySinh=b.NgaySinh,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy,
                        DiemTongKet=(a.DiemMieng+a.Diem15Phut+a.Diem1Tiet*2+a.DiemHocKy*3)*1.0/7.0 ,
                        id_Lop = b.id_Lop
                    }
                ).Where(n => n.id_Ky.Trim().Equals(idKy.Trim()) && n.id_MonHoc.Trim().Equals(idMon.Trim()) && n.id_Lop.Trim().Equals(idLop));


            return list;
        }

        /// <summary>
        /// Điểm tổng kết của 1 môn trong học kỳ 1
        /// </summary>
        /// <param name="idNam"></param>
        /// <param name="idMon"></param>
        /// <param name="idLop"></param>
        /// <returns></returns>
        public IQueryable showBangDiemTheoLopTheoTungMon_K1(String idNam, String idMon, String idLop)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        NgaySinh = b.NgaySinh,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy,
                        
                        id_Lop = b.id_Lop
                    }
                ).Join(
                    context.tlb_Kies,
                    c => c.id_Ky,
                    d => d.id_Ky,
                    (c, d) => new
                    {

                        id_HocSinh = c.id_HocSinh,
                        id_NamHoc = d.id_NamHoc,
                        id_Lop = c.id_Lop,
                        HoTenHS = c.HoTenHS,
                        id_Ky = c.id_Ky,
                        id_GiaoVien = c.id_GiaoVien,
                        id_MonHoc = c.id_MonHoc,
                        NgaySinh = c.NgaySinh,
                        DiemMieng = c.DiemMieng,
                        Diem15Phut = c.Diem15Phut,
                        Diem1Tiet = c.Diem1Tiet,
                        DiemHocKy = c.DiemHocKy,
                        TenKy = d.TenKy
                    }
                ).Join(
                    context.tbl_NamHocs,
                    f => f.id_NamHoc,
                    g => g.id_NamHoc,
                    (f, g) => new
                    {
                        id_HocSinh = f.id_HocSinh,
                        id_NamHoc = g.id_NamHoc,
                        id_MonHoc=f.id_MonHoc,
                        id_Lop = f.id_Lop,
                        HoTenHS = f.HoTenHS,
                        NgaySinh = f.NgaySinh,
                        DiemTongKet = (f.DiemMieng + f.Diem15Phut + f.Diem1Tiet * 2 + f.DiemHocKy * 3) / 7.0,
                        TenKy = f.TenKy
                    }

                ).Where(n => n.id_NamHoc.Equals(idNam) && n.TenKy.Equals("Kỳ 1") && n.id_MonHoc.Trim().Equals(idMon.Trim()) && n.id_Lop.Trim().Equals(idLop)).Select(p => p.DiemTongKet.ToString());


            return list;
        }
        /// <summary>
        /// Điểm tổng kết của một môn trong học kỳ 2
        /// </summary>
        /// <param name="idNam"></param>
        /// <param name="idMon"></param>
        /// <param name="idLop"></param>
        /// <returns></returns>
        public IQueryable showBangDiemTheoLopTheoTungMon_K2(String idNam, String idMon, String idLop)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        NgaySinh = b.NgaySinh,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy,

                        id_Lop = b.id_Lop
                    }
                ).Join(
                    context.tlb_Kies,
                    c => c.id_Ky,
                    d => d.id_Ky,
                    (c, d) => new
                    {

                        id_HocSinh = c.id_HocSinh,
                        id_NamHoc = d.id_NamHoc,
                        id_Lop = c.id_Lop,
                        HoTenHS = c.HoTenHS,
                        id_Ky = c.id_Ky,
                        id_GiaoVien = c.id_GiaoVien,
                        id_MonHoc = c.id_MonHoc,
                        NgaySinh = c.NgaySinh,
                        DiemMieng = c.DiemMieng,
                        Diem15Phut = c.Diem15Phut,
                        Diem1Tiet = c.Diem1Tiet,
                        DiemHocKy = c.DiemHocKy,
                        TenKy = d.TenKy
                    }
                ).Join(
                    context.tbl_NamHocs,
                    f => f.id_NamHoc,
                    g => g.id_NamHoc,
                    (f, g) => new
                    {
                        id_HocSinh = f.id_HocSinh,
                        id_NamHoc = g.id_NamHoc,
                        id_MonHoc = f.id_MonHoc,
                        id_Lop = f.id_Lop,
                        HoTenHS = f.HoTenHS,
                        NgaySinh = f.NgaySinh,
                        DiemTongKet = (f.DiemMieng + f.Diem15Phut + f.Diem1Tiet * 2 + f.DiemHocKy * 3) / 7.0,
                        TenKy = f.TenKy
                    }

                ).Where(n => n.id_NamHoc.Equals(idNam) && n.TenKy.Equals("Kỳ 2") && n.id_MonHoc.Trim().Equals(idMon.Trim()) && n.id_Lop.Trim().Equals(idLop)).Select(p => p.DiemTongKet.ToString());


            return list;
        }
        /// <summary>
        /// Diểm tổng kết tất cả các môn của một học sinh
        /// </summary>
        /// <param name="idKy"></param>
        /// <param name="idHocSinh"></param>
        /// <returns></returns>
        public IQueryable showBangDiemTheoHocSinhCuaTatCaMon(String idKy, String idHocSinh)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        NgaySinh = b.NgaySinh,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy,
                        DiemTongKet = (a.DiemMieng + a.Diem15Phut + a.Diem1Tiet * 2 + a.DiemHocKy * 3) * 1.0 / 7.0,
                        id_Lop = b.id_Lop
                    }
                ).Where(n => n.id_Ky.Trim().Equals(idKy.Trim())&& n.id_HocSinh.Trim().Equals(idHocSinh.Trim())).Select(p=>p.DiemTongKet.ToString());


            return list;
        }
        /// <summary>
        /// Điểm tổng kết kỳ 1 của một năm bất kỳ
        /// </summary>
        /// <param name="idNam"></param>
        /// <param name="idHocSinh"></param>
        /// <returns></returns>
        public IQueryable showBangDiemTheoHocSinhCuaTatCaMonTrongNam_K1(String idNam, String idHocSinh)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        NgaySinh = b.NgaySinh,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy
                    }
                ).Join(
                    context.tlb_Kies,
                    c => c.id_Ky,
                    d => d.id_Ky,
                    (c, d) => new
                    {

                        id_HocSinh = c.id_HocSinh,
                        id_NamHoc = d.id_NamHoc,
                        HoTenHS = c.HoTenHS,
                        id_Ky = c.id_Ky,
                        id_GiaoVien = c.id_GiaoVien,
                        id_MonHoc = c.id_MonHoc,
                        NgaySinh = c.NgaySinh,
                        DiemMieng = c.DiemMieng,
                        Diem15Phut = c.Diem15Phut,
                        Diem1Tiet = c.Diem1Tiet,
                        DiemHocKy = c.DiemHocKy,
                        TenKy=d.TenKy
                    }
                ).Join(
                    context.tbl_NamHocs,
                    f => f.id_NamHoc,
                    g => g.id_NamHoc,
                    (f, g) => new
                    {
                        id_HocSinh = f.id_HocSinh,
                        id_NamHoc = g.id_NamHoc,
                        HoTenHS = f.HoTenHS, 
                        NgaySinh = f.NgaySinh,
                        DiemTongKet=(f.DiemMieng+f.Diem15Phut+f.Diem1Tiet*2+f.DiemHocKy*3)/7.0,
                        TenKy = f.TenKy
                    }

                ).Where(n => n.id_NamHoc.Equals(idNam) && n.TenKy.Trim().Equals("Kỳ 1") && n.id_HocSinh.Trim().Equals(idHocSinh.Trim())).Select(p => p.DiemTongKet.ToString());


            return list;
        }

        /// <summary>
        /// Bảng điểm kỳ 2 của một năm bất kỳ
        /// </summary>
        /// <param name="idNam"></param>
        /// <param name="idHocSinh"></param>
        /// <returns></returns>
        public IQueryable showBangDiemTheoHocSinhCuaTatCaMonTrongNam_K2(String idNam, String idHocSinh)
        {
            var list = context.tbl_BangDiems.Join(
                    context.tbl_HocSinhs,
                    a => a.id_HocSinh,
                    b => b.id_HocSinh,
                    (a, b) => new
                    {
                        id_BangDiem = a.id_BangDiem,
                        id_HocSinh = a.id_HocSinh,
                        HoTenHS = b.HoTenHS,
                        id_Ky = a.id_Ky,
                        id_GiaoVien = a.id_GiaoVien,
                        id_MonHoc = a.id_MonHoc,
                        NgaySinh = b.NgaySinh,
                        DiemMieng = a.DiemMieng,
                        Diem15Phut = a.Diem15Phut,
                        Diem1Tiet = a.Diem1Tiet,
                        DiemHocKy = a.DiemHocKy
                    }
                ).Join(
                    context.tlb_Kies,
                    c => c.id_Ky,
                    d => d.id_Ky,
                    (c, d) => new
                    {

                        id_HocSinh = c.id_HocSinh,
                        id_NamHoc = d.id_NamHoc,
                        HoTenHS = c.HoTenHS,
                        id_Ky = c.id_Ky,
                        id_GiaoVien = c.id_GiaoVien,
                        id_MonHoc = c.id_MonHoc,
                        NgaySinh = c.NgaySinh,
                        DiemMieng = c.DiemMieng,
                        Diem15Phut = c.Diem15Phut,
                        Diem1Tiet = c.Diem1Tiet,
                        DiemHocKy = c.DiemHocKy,
                        TenKy = d.TenKy
                    }
                ).Join(
                    context.tbl_NamHocs,
                    f => f.id_NamHoc,
                    g => g.id_NamHoc,
                    (f, g) => new
                    {
                        id_HocSinh = f.id_HocSinh,
                        id_NamHoc=g.id_NamHoc,
                        HoTenHS = f.HoTenHS,
                        NgaySinh = f.NgaySinh,
                        DiemTongKet = (f.DiemMieng + f.Diem15Phut + f.Diem1Tiet * 2 + f.DiemHocKy * 3) / 7.0,
                        TenKy = f.TenKy
                    }

                ).Where(n => n.id_NamHoc.Equals(idNam) && n.TenKy.Trim().Equals("Kỳ 2") && n.id_HocSinh.Trim().Equals(idHocSinh.Trim())).Select(p => p.DiemTongKet.ToString());


            return list;
        }
        /// <summary>
        /// Bảng điểmxxx
        /// </summary>
        /// <param name="idKy"></param>
        /// <param name="idGV"></param>
        /// <param name="idMon"></param>
        /// <param name="idLop"></param>
        /// <returns></returns>
        public List<tbl_BangDiem> showBangDiemTungLop(String idKy, String idGV, String idMon)
        {
            return context.tbl_BangDiems.Where(n => n.id_Ky.Trim().Equals(idKy.Trim())
                                                    && n.id_GiaoVien.Trim().Equals(idGV.Trim())
                                                    && n.id_MonHoc.Trim().Equals(idMon.Trim())
                                                    ).ToList<tbl_BangDiem>();
                //context.tbl_BangDiems.Where(n => n.id_Ky.Trim().Equals(idKy.Trim()) 
                //                                    && n.id_GiaoVien.Trim().Equals(idGV.Trim()) 
                //                                    && n.id_MonHoc.Trim().Equals(idMon.Trim()) 
                //                                    && n.id_Lop.Trim().Equals(idLop));


            
        }

        
        /// <summary>
        /// Điểm tổng kết của từng kỳ của từng lớp
        /// </summary>
        /// <param name="idKy"></param>
        /// <param name="idMon"></param>
        /// <param name="idLop"></param>
        /// <returns></returns>
        //public IQueryable KetQuaHKLop(String idKy, String idLop,String idHocSinh)
        //{
        //    var list = context.tbl_BangDiems.Join(
        //            context.tbl_HocSinhs,
        //            a => a.id_HocSinh,
        //            b => b.id_HocSinh,
        //            (a, b) => new
        //            {
        //                id_BangDiem = a.id_BangDiem,
        //                id_HocSinh = a.id_HocSinh,
        //                id_MonHoc = a.id_MonHoc,
        //                HoTenHS = b.HoTenHS,
        //                NgaySinh = b.NgaySinh,
        //                id_Ky = a.id_Ky,
        //                id_GiaoVien = a.id_GiaoVien,
        //                DiemMieng = a.DiemMieng,
        //                Diem15Phut = a.Diem15Phut,
        //                Diem1Tiet = a.Diem1Tiet,
        //                DiemHocKy = a.DiemHocKy,
        //                DiemTongKet = (a.DiemMieng + a.Diem15Phut + a.Diem1Tiet * 2 + a.DiemHocKy * 3) / 7,
        //                id_Lop = b.id_Lop
        //            }
        //        ).Join(
        //            context.tbl_MonHocs,
        //            c => c.id_MonHoc,
        //            d => d.id_MonHoc,
        //            (c, d) => new
        //            {
        //                id_BangDiem = c.id_BangDiem,
        //                id_HocSinh = c.id_HocSinh,
        //                id_MonHoc = c.id_MonHoc,
        //                HoTenHS = c.HoTenHS,
        //                NgaySinh = c.NgaySinh,
        //                id_Ky = c.id_Ky,
        //                id_GiaoVien = c.id_GiaoVien,
                        
        //                DiemTongKet = c.DiemTongKet,
        //                id_Lop = c.id_Lop,
        //                TenMonHoc=d.TenMonHoc
        //            }
        //        ).Where(n => n.id_Ky.Trim().Equals(idKy.Trim()) && n.id_Lop.Trim().Equals(idLop) && n.id_HocSinh.Equals(idHocSinh));

        //    return list;
        //}


        

        public DataTable ToDataTable(object query)
        {
            if (query == null)
            {
                throw new ArgumentNullException("query");
            }

            IDbCommand cmd = context.GetCommand(query as IQueryable);
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = (SqlCommand)cmd;
            DataTable dt = new DataTable();

            try
            {
                cmd.Connection.Open();
                adapter.FillSchema(dt, SchemaType.Source);
                adapter.Fill(dt);
            }
            finally
            {
                cmd.Connection.Close();
            }
            return dt;
        }
        

        
    }
}
